package arrays_learn

import "fmt"

/*
数组是同一种数据类型元素的集合。 在Go语言中，数组从声明时就确定，使用时可以修改数组成员，但是数组大小不可变化
*/

//创建一个指定长度为3的数组，  数组的元素可以改变，但是数组的大小不能变，  数组大小 变了就是又新创建一个数组
var a [3]int

//数组定义
//var 数组变量名 [元素数量]T

//var a [5]int， 数组的长度必须是常量，并且长度是数组类型的一部分。一旦定义，长度不能变。 [5]int和[10]int是不同的类型。
//
//数组可以通过下标进行访问，下标是从0开始，最后一个元素下标是：len-1，访问越界（下标在合法范围之外），则触发访问越界，会panic。

//todo 数组初始化
func initArray() {
	var testArray [3]int
	var numArray = [3]int{1, 2}
	var cityArray = [3]string{"北京", "上海", "深圳"}
	fmt.Println(testArray) //[0 0 0]
	fmt.Println(numArray)  //[1 2 0]
	fmt.Println(cityArray) //[北京 上海 深圳]
}

//这样写每次都要确保提供的初始值和数组长度一致，但是一般情况下我们只需要让编译器根据初始值的个数自行推断数组的长度，例如：
func array() {
	var testArray [3]int
	var numArray = [...]int{1, 2}
	var cityArray = [...]string{"北京", "上海", "深圳"}
	fmt.Println(testArray) //[0 0 0]
	fmt.Println(numArray)  //[1 2]
	fmt.Println(cityArray) //[北京 上海 深圳]
}

//我们还可以使用指定索引值的方式来初始化数组，例如:
func aaa() {
	a := [...]int{1: 1, 3: 5}
	fmt.Println(a)                  // [0 1 0 5]
	fmt.Printf("type of a:%T\n", a) //type of a:[4]int
}

//todo 数组的遍历

//// 方法1：for循环遍历
//for i := 0; i < len(a); i++ {
//    fmt.Println(a[i])
//}
//
//// 方法2：range遍历
//for index, v := range a {
//    fmt.Println(index， v)
//}

//todo 1. 数组是值类型，赋值和传参会复制整个数组，而不是指针。因此改变副本的值，不会改变本身的值。
//todo 2. 支持 “==“、”!=” 操作符，因为内存总是被初始化过的。 3. 指针数组 [n]*T，数组指针 *[n]T。
